import os
import subprocess
from pathlib import Path

def process_test_file(cpp_path, test_file):
    """处理单个test.in文件"""
    # 获取子目录名（test.in所在目录的名字）
    subdir_name = test_file.parent.name
    
    # 读取文件内容（保持原始字节数据）
    with open(test_file, 'rb') as f:
        input_data = f.read()
    
    # 调用C++程序，传递子目录名作为参数
    result = subprocess.run(
        [str(cpp_path), subdir_name],  # 添加子目录名作为第二个参数
        input=input_data,
        capture_output=True
    )
    
    # 解码输出结果
    print(result.stdout.decode('utf-8'))
    if result.stderr:
        print("错误:", result.stderr.decode('utf-8'))

def traverse_directory(cpp_path, root_dir):
    """递归处理目录"""
    root_path = Path(root_dir)
    
    # 遍历所有子目录
    for dirpath, _, filenames in os.walk(root_path):
        if 'test.in' in filenames:
            test_file = Path(dirpath) / 'test.in'
            process_test_file(cpp_path, test_file)

if __name__ == "__main__":
    # 配置路径
    print("实验开始")
    CPP_EXECUTABLE = Path("./bt_01knapsack").absolute()  # 修改为无.exe后缀
    DATA_DIR = Path("./problemInstances").absolute()
    
    # 验证路径
    if not CPP_EXECUTABLE.exists():
        raise FileNotFoundError(f"C++程序不存在于 {CPP_EXECUTABLE}")
    if not DATA_DIR.exists():
        raise FileNotFoundError(f"数据目录不存在于 {DATA_DIR}")
    
    # 开始处理
    # print(f"开始处理目录: {DATA_DIR}")
    traverse_directory(CPP_EXECUTABLE, DATA_DIR)
    print("实验结束")